home *** CD-ROM | disk | FTP | other *** search
/ Aminet 31 / Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso / Aminet / game / 2play / YATAG.lha / yatag / source / Inits&Subs.cpp < prev    next >
C/C++ Source or Header  |  1999-03-05  |  64KB  |  2,023 lines

  1. // Alle Sub-Routinen für das Game, ausgelagert wegen Übersichtlichkeit
  2. // @1998 Dreamworlds Development / Stefan Schulze / Thomas Schulze
  3.  
  4. #include <stdlib.h>
  5. #include <clib/rtgmaster_protos.h>
  6.  
  7. #ifndef __PPC__
  8.     #include <pragma/rtgmaster_lib.h>
  9.     #include <pragma/exec_lib.h>
  10. #endif
  11.  
  12. #include <devices/ahi.h>
  13. #include <proto/ahi.h>
  14. #include <rtgmaster/rtgmaster.h>
  15. #include <rtgmaster/rtgsublibs.h>
  16. #include <clib/exec_protos.h>
  17. #include <clib/dos_protos.h>
  18. #include <clib/lowlevel_protos.h>
  19. #include <utility/tagitem.h>
  20. #include <exec/memory.h>
  21.  
  22. #include "defines.h"
  23.  
  24. void  InitAlles();
  25. void  LadeFile(STRPTR Datei, APTR ZielBuffer, LONG Laenge);
  26. void  AllesZu(LONG FehlerCode);
  27. void  Schwarz(LONG x1, LONG y1, LONG x2, LONG y2);
  28. void  Umriss(LONG ZielX, LONG ZielY, LONG Breite, LONG Hoehe, UBYTE *GfxData, UBYTE Farbe);
  29. void  PasteGfx(LONG ZielX, LONG ZielY, LONG Breite, LONG Hoehe, UBYTE *GfxData);
  30. void  PasteGfxNoMask(LONG ZielX, LONG ZielY, LONG Breite, LONG Hoehe, UBYTE *GfxData);
  31. void  PasteGfxNoMask2(LONG ZielX, LONG ZielY, LONG Breite, LONG Hoehe, UBYTE *GfxData);
  32. void  RemoveGfx(LONG ZielX, LONG ZielY, LONG Breite, LONG Hoehe, UBYTE *GfxData);
  33. void  Klatsch();
  34. void  NeuesObjekt(UBYTE Type, LONG x, LONG y, LONG rx, LONG ry, LONG Pause);
  35. void  MachMaObjekte();
  36. void  Kawomm(LONG x, LONG y, UBYTE Dicke);
  37. void  RefreshZahl();
  38. void  RefreshREnerg();
  39. void  MachMaRaumer();
  40. void  SetzeKursGruen(LONG kx, LONG ky);
  41. void  SetzeKursBlau(LONG kx, LONG ky);
  42. void  RefreshWand();
  43. void  NeueBombe(LONG x, LONG y, LONG rx, LONG ry, UBYTE Typ, UBYTE Seite);
  44. void  MachMaBombe();
  45. void  NeuerLaser(UBYTE Typ, LONG sx, LONG sy, LONG zx, LONG zy);
  46. void  MachMaLaser();
  47. UBYTE SucheZiel(LONG x, LONG y, UBYTE Seite, LONG MaxEntf);
  48. BOOL  MachMaLaserSt();
  49. void  MachMaBasis();
  50. BOOL  OpenAHI();
  51. void  CloseAHI();
  52. BOOL  AllocAudio();
  53. void  FreeAudio();
  54. UWORD LoadSample(STRPTR filename, ULONG type);
  55. void  UnloadSample(UWORD id);
  56. void  SpielMaSample(WORD SampleID, ULONG Frequenz);
  57. void  SpielMaSample2(WORD SampleID, LONG Freq);
  58. void  MachMaSounds();
  59.  
  60. // ------------------------------------------------------------------------------------------------
  61.  
  62. extern struct Library *RTGMasterBase=NULL;
  63. extern struct Library *LowLevelBase=NULL;
  64.  
  65. extern struct ScreenReq *sr=NULL;
  66. extern struct RtgScreen *RScreen=NULL;
  67. extern UBYTE *MapA;
  68. extern int format=0;
  69. extern LONG GlobTime=0;
  70.  
  71. extern LONG *Palette = NULL;
  72. extern ULONG *Wurzel = NULL;
  73. extern UBYTE *Buffer = NULL, *GameScr = NULL, *GfxTab = NULL, *Titel = NULL, *Pause = NULL, *Schaf=NULL;
  74.  
  75. extern struct Objekt Obj[500];
  76. extern struct Raumer Fli[20];
  77. extern struct KeyQuery kq[25];
  78. extern struct Bombe Bo[10];
  79. extern struct Laser La[20];
  80. extern struct LaserSt LS[4];
  81. extern LONG Basis[2];
  82.  
  83. extern UBYTE Kanal;
  84. extern WORD SmpID[16];
  85. extern BOOL SNDStation, SNDRungs, SNDFetz, SNDMiniLaser, SNDBigLaser, SNDBomm;
  86.  
  87. extern APTR samples[MAXSAMPLES] = { 0 };
  88.  
  89. extern struct Library      *AHIBase;
  90. extern struct MsgPort      *AHImp     = NULL;
  91. extern struct AHIRequest   *AHIio     = NULL;
  92. extern BYTE                 AHIDevice = -1;
  93. extern struct AHIAudioCtrl *actrl     = NULL;
  94.  
  95. extern LONG mixfreq = 0;
  96.  
  97. struct TagItem rtag[] = {
  98.     smr_MinWidth,       640,
  99.     smr_MinHeight,      480,
  100.     smr_MaxWidth,       640,
  101.     smr_MaxHeight,      512,
  102.     smr_ChunkySupport,  LUT8,
  103.     smr_PlanarSupport,  -1,
  104.     smr_Buffers,1,
  105.     TAG_DONE,           NULL
  106. };
  107.  
  108. struct TagItem gtag[] = {
  109.     grd_PixelLayout,    0,
  110.     grd_ColorSpace,     0,
  111.     TAG_DONE,           0
  112. };
  113.  
  114. struct TagItem tacks[] = {
  115.     rtg_Buffers,1,
  116.     TAG_DONE,0
  117. };
  118.  
  119. // ------------------------------------------------------------------------------------------------
  120. // Refresht die Wände der Basen
  121. //
  122. // Parameter:     -Keine-
  123. //
  124. // globale Var's: -Keine-
  125. //
  126.  
  127. void RefreshWand() {
  128.   if (Basis[0]==100) {
  129.     PasteGfx(3, 475, 6, 6, Mauer);
  130.     PasteGfx(9, 475, 6, 6, Mauer);
  131.     PasteGfx(15, 475, 6, 6, Mauer);
  132.     PasteGfx(21, 475, 6, 6, Mauer);
  133.     PasteGfx(27, 475, 6, 6, Mauer);
  134.     PasteGfx(33, 475, 6, 6, Mauer);
  135.     PasteGfx(39, 475, 6, 6, Mauer);
  136.  
  137.     PasteGfx(3, 375, 6, 6, Mauer);
  138.     PasteGfx(9, 375, 6, 6, Mauer);
  139.     PasteGfx(15, 375, 6, 6, Mauer);
  140.     PasteGfx(21, 375, 6, 6, Mauer);
  141.     PasteGfx(27, 375, 6, 6, Mauer);
  142.     PasteGfx(33, 375, 6, 6, Mauer);
  143.     PasteGfx(39, 375, 6, 6, Mauer);
  144.     }
  145.  
  146.   if(Basis[1]==100) {
  147.     PasteGfx(637, 28, 6, 6, Mauer);
  148.     PasteGfx(631, 28, 6, 6, Mauer);
  149.     PasteGfx(625, 28, 6, 6, Mauer);
  150.     PasteGfx(619, 28, 6, 6, Mauer);
  151.     PasteGfx(613, 28, 6, 6, Mauer);
  152.     PasteGfx(607, 28, 6, 6, Mauer);
  153.     PasteGfx(601, 28, 6, 6, Mauer);
  154.  
  155.     PasteGfx(637, 130, 6, 6, Mauer);
  156.     PasteGfx(631, 130, 6, 6, Mauer);
  157.     PasteGfx(625, 130, 6, 6, Mauer);
  158.     PasteGfx(619, 130, 6, 6, Mauer);
  159.     PasteGfx(613, 130, 6, 6, Mauer);
  160.     PasteGfx(607, 130, 6, 6, Mauer);
  161.     PasteGfx(601, 130, 6, 6, Mauer);
  162.     }
  163.   }
  164.  
  165. // ------------------------------------------------------------------------------------------------
  166. // Verändert den Kurs aller aktivierten Raumer des grünen Spielers
  167. //
  168. // Parameter:     LONG kx                       (Kursveränderung auf der X-Achse)
  169. //                LONG ky                       (Kursveränderung auf der Y-Achse)
  170. //
  171. // globale Var's: struct Raumer Fli[20]         (Array von Raumerstrukturen zur Verwaltung)
  172. //
  173.  
  174. void SetzeKursGruen(LONG kx, LONG ky) {
  175.   int i;
  176.   BOOL Zahlen;
  177.  
  178.   for(i=0; i<10; i++) {
  179.     if((Fli[i].Aktiv)&&(Fli[i].Typ!=Tot)&&(!Fli[i].Raucher)) {
  180.       if(Fli[i].Befehl) {
  181.         Fli[i].Befehl=Nichts;
  182.         Zahlen=TRUE;
  183.         }
  184.       Fli[i].KursX+=(kx*48);
  185.       Fli[i].KursY+=(ky*48);
  186.  
  187.       if(Fli[i].Typ<=SFighter) {
  188.         if(Fli[i].KursX<-672) Fli[i].KursX=-672;
  189.         if(Fli[i].KursX>672) Fli[i].KursX=672;
  190.         if(Fli[i].KursY<-672) Fli[i].KursY=-672;
  191.         if(Fli[i].KursY>672) Fli[i].KursY=672;
  192.         }
  193.  
  194.       if(Fli[i].Typ>=Bomber) {
  195.         if(Fli[i].KursX<-480) Fli[i].KursX=-480;
  196.         if(Fli[i].KursX>480) Fli[i].KursX=480;
  197.         if(Fli[i].KursY<-480) Fli[i].KursY=-480;
  198.         if(Fli[i].KursY>480) Fli[i].KursY=480;
  199.         }
  200.       }
  201.     }
  202.   if(Zahlen) RefreshZahl();
  203.   }
  204.  
  205. // ------------------------------------------------------------------------------------------------
  206. // Verändert den Kurs aller aktivierten Raumer des blauen Spielers
  207. //
  208. // Parameter:     LONG kx                       (Kursveränderung auf der X-Achse)
  209. //                LONG ky                       (Kursveränderung auf der Y-Achse)
  210. //
  211. // globale Var's: struct Raumer Fli[20]         (Array von Raumerstrukturen zur Verwaltung)
  212.  
  213. void SetzeKursBlau(LONG kx, LONG ky) {
  214.   int i;
  215.   BOOL Zahlen=FALSE;
  216.  
  217.   for(i=10; i<20; i++) {
  218.     if((Fli[i].Aktiv)&&(Fli[i].Typ!=Tot)&&(!Fli[i].Raucher)) {
  219.       if(Fli[i].Befehl) {
  220.         Fli[i].Befehl=Nichts;
  221.         Zahlen=TRUE;
  222.         }
  223.  
  224.       Fli[i].KursX+=(kx*48);
  225.       Fli[i].KursY+=(ky*48);
  226.  
  227.       if(Fli[i].Typ<=SFighter) {
  228.         if(Fli[i].KursX<-672) Fli[i].KursX=-672;
  229.         if(Fli[i].KursX>672) Fli[i].KursX=672;
  230.         if(Fli[i].KursY<-672) Fli[i].KursY=-672;
  231.         if(Fli[i].KursY>672) Fli[i].KursY=672;
  232.         }
  233.  
  234.       if(Fli[i].Typ>=Bomber) {
  235.         if(Fli[i].KursX<-480) Fli[i].KursX=-480;
  236.         if(Fli[i].KursX>480) Fli[i].KursX=480;
  237.         if(Fli[i].KursY<-480) Fli[i].KursY=-480;
  238.         if(Fli[i].KursY>480) Fli[i].KursY=480;
  239.         }
  240.       }
  241.     }
  242.   if(Zahlen) RefreshZahl();
  243.   }
  244.  
  245. // ------------------------------------------------------------------------------------------------
  246. // Organisierung der Raumer, aller Arten und Größen
  247. //
  248. // Parameter:     -Nix-
  249. //
  250. // globale Var's: struct Raumer Fli[20]         (Array von Raumerstrukturen zur Verwaltung)
  251. //
  252.  
  253. void MachMaRaumer() {
  254.   UBYTE j;
  255.   BOOL Zahlen=FALSE;
  256.   LONG ax,ay;
  257.  
  258.   for(UBYTE i=0; i<20; i++) {
  259.     if(Fli[i].Typ!=Tot) {
  260.       // Alle Raumer weg vom Screen (nicht ganz weg, nur a bissel unsichtbar [Keine Angst])
  261.       if(Fli[i].Seite==Blau) {
  262.         if(Fli[i].Typ>=Bomber) RemoveGfx(Fli[i].RealX>>8, Fli[i].RealY>>8, 3, 3, BlBomber);
  263.         if(Fli[i].Typ<=SFighter) RemoveGfx(Fli[i].RealX>>8, Fli[i].RealY>>8, 3, 5, BlFighter);
  264.         }
  265.       else {
  266.         if(Fli[i].Typ>=Bomber) RemoveGfx(Fli[i].RealX>>8, Fli[i].RealY>>8, 3, 3, GrBomber);
  267.         if(Fli[i].Typ<=SFighter) RemoveGfx(Fli[i].RealX>>8, Fli[i].RealY>>8, 3, 5, GrFighter);
  268.         }
  269.  
  270.       // Jetzt organisieren wie blöde
  271.  
  272.       // Als erstes prüfen, ob der Raumer einen Befehl hat
  273.  
  274.       if(Fli[i].Befehl==Anhalten) {
  275.         if(Fli[i].KursX<0) Fli[i].KursX+=48;
  276.         if(Fli[i].KursX>0) Fli[i].KursX-=48;
  277.         if(Fli[i].KursY<0) Fli[i].KursY+=48;
  278.         if(Fli[i].KursY>0) Fli[i].KursY-=48;
  279.  
  280.         if((Fli[i].KursX==0)&&(Fli[i].KursY==0)) {
  281.           Fli[i].Befehl=Nichts;
  282.           Zahlen=TRUE;
  283.           }
  284.         }
  285.  
  286.       // Befehl: Heimweg über Umweg, 1. Etappe
  287.       if((Fli[i].Befehl==Umweg)&&(Fli[i].Raucher==FALSE)) {
  288.         LONG zx,zy;         // Zielkoordinaten, Vergleichskoordinaten
  289.  
  290.         // Zielkoordinaten ca. 50 Pixel vor jeweiliger LandePos
  291.         if(Fli[i].Seite==Gruen) {
  292.           zx=70<<8; zy=(380+i*8)<<8;
  293.           }
  294.         else {
  295.           zx=560<<8; zy=(-20+i*8)<<8;
  296.           }
  297.  
  298.         // Auf Zielkurs beschleunigen
  299.         if(Fli[i].RealX<zx-1024) Fli[i].KursX+=48;
  300.         else if(Fli[i].RealX>zx+1024) Fli[i].KursX-=48;
  301.         else {
  302.          if(Fli[i].KursX<0) Fli[i].KursX+=96;
  303.          if(Fli[i].KursX>0) Fli[i].KursX-=96;
  304.          }
  305.  
  306.         if(Fli[i].RealY<zy-1024) Fli[i].KursY+=48;
  307.         else if(Fli[i].RealY>zy+1024) Fli[i].KursY-=48;
  308.         else {
  309.          if(Fli[i].KursY<0) Fli[i].KursY+=96;
  310.          if(Fli[i].KursY>0) Fli[i].KursY-=96;
  311.          }
  312.  
  313.  
  314.         // MaxTempo einhalten
  315.         if(Fli[i].Typ<=SFighter) {
  316.           if(Fli[i].KursX<-672) Fli[i].KursX=-672;
  317.           if(Fli[i].KursX>672) Fli[i].KursX=672;
  318.           if(Fli[i].KursY<-672) Fli[i].KursY=-672;
  319.           if(Fli[i].KursY>672) Fli[i].KursY=672;
  320.           }
  321.  
  322.         if(Fli[i].Typ>=Bomber) {
  323.           if(Fli[i].KursX<-480) Fli[i].KursX=-480;
  324.           if(Fli[i].KursX>480) Fli[i].KursX=480;
  325.           if(Fli[i].KursY<-480) Fli[i].KursY=-480;
  326.           if(Fli[i].KursY>480) Fli[i].KursY=480;
  327.           }
  328.  
  329.         // Im Zielbereich?
  330.         ax = (Fli[i].RealX-zx)>>8; ay = (Fli[i].RealY-zy)>>8;
  331.         if((ax>-8)&&(ax<8)&&(ay>-8)&&(ay<8)) Fli[i].Befehl=Heimwaerts; // Dann Rest des Weges direkt
  332.         }
  333.  
  334.       // Befehl: Heimflug ohne Umweg/ Heimflug mit Umweg, 2. Etappe
  335.       if((Fli[i].Befehl==Heimwaerts)&&(Fli[i].Raucher==FALSE)) {
  336.         LONG zx,zy;         // Zielkoordinaten
  337.  
  338.         // Zielkoords: die LandePos
  339.         if(Fli[i].Seite==Gruen) {
  340.           zx=12<<8; zy=(385+i*8)<<8;
  341.           }
  342.         else {
  343.           zx=628<<8; zy=(-40+i*8)<<8;
  344.           }
  345.  
  346.         // Gen Ziel beschleunigen
  347.         if(Fli[i].RealX<zx-1024) Fli[i].KursX+=48;
  348.         else if(Fli[i].RealX>zx+1024) Fli[i].KursX-=48;
  349.         else {
  350.          if(Fli[i].KursX<0) Fli[i].KursX+=96;
  351.          if(Fli[i].KursX>0) Fli[i].KursX-=96;
  352.          }
  353.  
  354.         if(Fli[i].RealY<zy-1024) Fli[i].KursY+=48;
  355.         else if(Fli[i].RealY>zy+1024) Fli[i].KursY-=48;
  356.         else {
  357.          if(Fli[i].KursY<0) Fli[i].KursY+=96;
  358.          if(Fli[i].KursY>0) Fli[i].KursY-=96;
  359.          }
  360.  
  361.         // MaxTempo
  362.         if(Fli[i].Typ<=SFighter) {
  363.           if(Fli[i].KursX<-672) Fli[i].KursX=-672;
  364.           if(Fli[i].KursX>672) Fli[i].KursX=672;
  365.           if(Fli[i].KursY<-672) Fli[i].KursY=-672;
  366.           if(Fli[i].KursY>672) Fli[i].KursY=672;
  367.           }
  368.  
  369.         if(Fli[i].Typ>=Bomber) {
  370.           if(Fli[i].KursX<-480) Fli[i].KursX=-480;
  371.           if(Fli[i].KursX>480) Fli[i].KursX=480;
  372.           if(Fli[i].KursY<-480) Fli[i].KursY=-480;
  373.           if(Fli[i].KursY>480) Fli[i].KursY=480;
  374.           }
  375.  
  376.         // Da?
  377.         if(Fli[i].Seite==Gruen) {
  378.           if(Fli[i].RealX<30<<8) {
  379.             Fli[i].Befehl=Nichts;
  380.             Fli[i].Aktiv=FALSE;
  381.             Zahlen=TRUE;
  382.             }
  383.           }
  384.         else {
  385.           if(Fli[i].RealX>610<<8) {
  386.             Fli[i].Befehl=Nichts;
  387.             Fli[i].Aktiv=FALSE;
  388.             Zahlen=TRUE;
  389.             }
  390.           }
  391.         }
  392.  
  393.  
  394.       // Koordinaten neu berechnen
  395.  
  396.       Fli[i].RealX+=Fli[i].KursX;
  397.       Fli[i].RealY+=Fli[i].KursY;
  398.  
  399.       // Kollisionen mit Mauern prüfen
  400.  
  401.       if((Fli[i].RealX<44<<8)&&(Basis[0]==100)) {
  402.         if((Fli[i].RealY>371<<8)&&(Fli[i].RealY<378<<8)) {
  403.           Kawomm(Fli[i].RealX>>8, Fli[i].RealY>>8, Winzig);
  404.           Fli[i].Raucher=FALSE;
  405.           Fli[i].Typ=Tot;
  406.           Zahlen=TRUE;
  407.           SNDFetz=TRUE;
  408.           }
  409.  
  410.         if(Fli[i].RealY>471<<8) {
  411.           Kawomm(Fli[i].RealX>>8, Fli[i].RealY>>8, Winzig);
  412.           Fli[i].Raucher=FALSE;
  413.           Fli[i].Typ=Tot;
  414.           Zahlen=TRUE;
  415.           SNDFetz=TRUE;
  416.           }
  417.         }
  418.  
  419.       if((Fli[i].RealX>596<<8)&&(Basis[1]==100)) {
  420.         if((Fli[i].RealY>125<<8)&&(Fli[i].RealY<135<<8)) {
  421.           Kawomm(Fli[i].RealX>>8, Fli[i].RealY>>8, Winzig);
  422.           Fli[i].Raucher=FALSE;
  423.           Fli[i].Typ=Tot;
  424.           Zahlen=TRUE;
  425.           SNDFetz=TRUE;
  426.           }
  427.  
  428.         if(Fli[i].RealY<32<<8) {
  429.           Kawomm(Fli[i].RealX>>8, Fli[i].RealY>>8, Winzig);
  430.           Fli[i].Raucher=FALSE;
  431.           Fli[i].Typ=Tot;
  432.           Zahlen=TRUE;
  433.           SNDFetz=TRUE;
  434.           }
  435.         }
  436.     //Kollisionen mit Laserstationen
  437.     for (j=0; j<4; j++) {
  438.       ax=(Fli[i].RealX>>8)-LS[j].RealX;
  439.       ay=(Fli[i].RealY>>8)-LS[j].RealY;
  440.       if((ax>-5)&&(ax<5)&&((j>>1)!=Fli[i].Seite)) {
  441.         if((ay>-5)&&(ay<5)) {
  442.           Kawomm(Fli[i].RealX>>8, Fli[i].RealY>>8, Winzig);
  443.           LS[j].Energie-=30;
  444.           if(LS[j].Energie<0) LS[j].Energie=0;
  445.           Fli[i].Raucher=FALSE;
  446.           Fli[i].Typ=Tot;
  447.           Zahlen=TRUE;
  448.           SNDFetz=TRUE;
  449.           }
  450.         }
  451.       }
  452.  
  453.       // Kollisionen mit anderen Raumern prüfen
  454.  
  455.       if(Fli[i].Seite==Gruen) {
  456.         for(j=10; j<20; j++) {
  457.           if(Fli[j].Typ!=Tot) {
  458.             register LONG fl=0;
  459.             ax=Fli[i].RealX-Fli[j].RealX;
  460.             ay=Fli[i].RealY-Fli[j].RealY;
  461.  
  462.             if((ax>-512)&&(ax<512)) fl=3;
  463.             if((ay>-512)&&(ay<512)&&(fl==3)) {
  464.               Kawomm(Fli[i].RealX>>8, Fli[i].RealY>>8, Winzig);
  465.               Fli[i].Raucher=FALSE;
  466.               Fli[i].Typ=Tot;
  467.               Fli[j].Raucher=FALSE;
  468.               Fli[j].Typ=Tot;
  469.               Zahlen=TRUE;
  470.               SNDFetz=TRUE;
  471.               }
  472.             }
  473.           }
  474.         }
  475.  
  476.       if(Fli[i].Typ!=Tot) {
  477.         if(Fli[i].Seite==Blau) {
  478.           for(j=0; j<10; j++) {
  479.             if(Fli[j].Typ!=Tot) {
  480.               register LONG fl=0;
  481.               ax=Fli[i].RealX-Fli[j].RealX;
  482.               ay=Fli[i].RealY-Fli[j].RealY;
  483.  
  484.               if((ax>-512)&&(ax<512)) fl=3;
  485.               if((ay>-512)&&(ay<512)&&(fl==3)) {
  486.                 Kawomm(Fli[i].RealX>>8, Fli[i].RealY>>8, Winzig);
  487.                 Fli[i].Raucher=FALSE;
  488.                 Fli[i].Typ=Tot;
  489.                 Fli[j].Raucher=FALSE;
  490.                 Fli[j].Typ=Tot;
  491.                 Zahlen=TRUE;
  492.                 SNDFetz=TRUE;
  493.                 }
  494.               }
  495.             }
  496.           }
  497.         }
  498.  
  499.       // Landemanöver einleiten! (Y-Kurs beschränken in Basis)
  500.  
  501.       if(!Fli[i].Raucher) {
  502.         if(Fli[i].Seite==Blau) {
  503.           if((Fli[i].RealY<32512)&&(Fli[i].RealX>155904)) {
  504.             if(Fli[i].KursY<0) Fli[i].KursY+=48;
  505.             if(Fli[i].KursY>0) Fli[i].KursY-=48;
  506.             if(Fli[i].RealX>156160&&Fli[i].KursX>0) Fli[i].KursX-=48;
  507.             if(Fli[i].KursY>-48&&Fli[i].KursY<48) Fli[i].KursY=0;
  508.             if(Fli[i].KursX>-48&&Fli[i].KursX<48) Fli[i].KursX=0;
  509.             if((Fli[i].KursX==0)&&(Fli[i].KursY==0)) {
  510.               if(Fli[i].Energie<Fli[i].MaxEnergie) {
  511.                 if (Basis[1]==100) {
  512.                   if ((GlobTime&3)==0) {
  513.                     Fli[i].Energie++;
  514.                     Zahlen=TRUE;
  515.                     }
  516.                   }
  517.                 else {
  518.                   if ((GlobTime&31)==0) {
  519.                     Fli[i].Energie++;
  520.                     Zahlen=TRUE;
  521.                     }
  522.                   }
  523.                 }
  524.               else {
  525.                 if(Basis[1]==100) Fli[i].Ballern=TRUE;
  526.                 }
  527.               }
  528.             }
  529.           else {
  530.             if((Fli[i].Energie<Fli[i].MaxEnergie)&&((GlobTime&31)==0)) {
  531.               if((Fli[i].KursX==0)&&(Fli[i].KursY==0)) {
  532.                 Fli[i].Energie++;
  533.                 Zahlen=TRUE;
  534.                 }
  535.               }
  536.             }
  537.           }
  538.         else {
  539.           if((Fli[i].RealY>96768)&&(Fli[i].RealX<7680)) {
  540.             if(Fli[i].KursY<0) Fli[i].KursY+=48;
  541.             if(Fli[i].KursY>0) Fli[i].KursY-=48;
  542.             if(Fli[i].RealX<7680&&Fli[i].KursX<0) Fli[i].KursX+=48;
  543.             if(Fli[i].KursY>-48&&Fli[i].KursY<48) Fli[i].KursY=0;
  544.             if(Fli[i].KursX>-48&&Fli[i].KursX<48) Fli[i].KursX=0;
  545.             if((Fli[i].KursX==0)&&(Fli[i].KursY==0)) {
  546.               if(Fli[i].Energie<Fli[i].MaxEnergie) {
  547.                 if (Basis[0]==100) {
  548.                   if ((GlobTime&3)==0) {
  549.                     Fli[i].Energie++;
  550.                     Zahlen=TRUE;
  551.                     }
  552.                   }
  553.                 else {
  554.                   if ((GlobTime&31)==0) {
  555.                     Fli[i].Energie++;
  556.                     Zahlen=TRUE;
  557.                     }
  558.                   }
  559.                 }
  560.               else {
  561.                 if(Basis[0]==100) Fli[i].Ballern=TRUE; // Bomber wieder aufladen
  562.                 }
  563.               }
  564.             }
  565.           else {
  566.             if((Fli[i].Energie<Fli[i].MaxEnergie)&&((GlobTime&31)==0)) {
  567.               if((Fli[i].KursX==0)&&(Fli[i].KursY==0)) {
  568.                 Fli[i].Energie++;
  569.                 Zahlen=TRUE;
  570.                 }
  571.               }
  572.             }
  573.           }
  574.         }
  575.  
  576.       // Raucht das Rind schon? (-> Stirbt gleich)
  577.  
  578.       if(Fli[i].Raucher) {
  579.         Fli[i].MaxEnergie--;
  580.         if(Fli[i].MaxEnergie==0) {
  581.           Kawomm(Fli[i].RealX>>8, Fli[i].RealY>>8, Winzig);
  582.           SNDFetz=TRUE;
  583.           Fli[i].Raucher=FALSE;
  584.           Fli[i].Typ=Tot;
  585.           Zahlen=TRUE;
  586.           }
  587.         if((Fli[i].MaxEnergie&1)==1) {
  588.           NeuesObjekt(Rauch, Fli[i].RealX>>8, Fli[i].RealY>>8, 0, 0, 0);
  589.           }
  590.  
  591.         }
  592.  
  593.       // Ist er außerhalb der SBZ ? (Schwerumkämpfte BesatzungsZone)
  594.       if((Fli[i].RealX<4<<8)||(Fli[i].RealX>636<<8)||(Fli[i].RealY<28<<8)||(Fli[i].RealY)>473<<8) {
  595.         // Dann machen wir ihn wech.
  596.         Fli[i].Typ=Tot;
  597.         SNDFetz=TRUE;
  598.         Fli[i].Raucher=FALSE;
  599.         Kawomm(Fli[i].RealX>>8, Fli[i].RealY>>8, Winzig);
  600.         Zahlen=TRUE;
  601.         }
  602.  
  603.       // Jetzt wieder herzaubern
  604.  
  605.       if(Fli[i].Typ!=Tot) {
  606.         if(Fli[i].Seite==Blau) {
  607.           if(Fli[i].Typ>=Bomber) PasteGfx(Fli[i].RealX>>8, Fli[i].RealY>>8, 3, 3, BlBomber);
  608.           if(Fli[i].Typ<=SFighter) PasteGfx(Fli[i].RealX>>8, Fli[i].RealY>>8, 3, 5, BlFighter);
  609.           }
  610.         else {
  611.           if(Fli[i].Typ>=Bomber) PasteGfx(Fli[i].RealX>>8, Fli[i].RealY>>8, 3, 3, GrBomber);
  612.           if(Fli[i].Typ<=SFighter) PasteGfx(Fli[i].RealX>>8, Fli[i].RealY>>8, 3, 5, GrFighter);
  613.           }
  614.         }
  615.       }
  616.     }
  617.   if(Zahlen) {
  618.     RefreshZahl();
  619.     RefreshREnerg();
  620.     Zahlen=FALSE;
  621.     }
  622.   }
  623.  
  624. // ------------------------------------------------------------------------------------------------
  625. // Refresht die Energieanzeige der Raumer (ob aktiv oder nich)
  626. //
  627. // Parameter:     -Keine-
  628. //
  629. // globale Var's: UBYTE *GameScr                (initialisierter Zeiger auf anzuzeigendes Bild)
  630. //                struct Raumer Fli[20]         (Array von Raumerstrukturen für Verwaltung)
  631.  
  632. void RefreshREnerg(void) {
  633.   int i;
  634.  
  635.   for(i=0; i<10; i++) {
  636.     if((Fli[i].Typ!=Tot)&&(!Fli[i].Raucher)) {
  637.       if((Fli[i].Typ==SBomber)||(Fli[i].Typ==SFighter))
  638.         PasteGfxNoMask2(10+(i*15), 17, 10, 5, EnergZahl+(50*(20-(Fli[i].Energie*2))));
  639.       else
  640.         PasteGfxNoMask2(10+(i*15), 17, 10, 5, EnergZahl+(50*(20-Fli[i].Energie)));
  641.       }
  642.     else {
  643.       Schwarz(5+(i*15), 13, 15+(i*15), 22);
  644.       }
  645.     }
  646.  
  647.   for(i=0; i<10; i++) {
  648.     if((Fli[i+10].Typ!=Tot)&&(!Fli[i+10].Raucher)) {
  649.       if((Fli[i+10].Typ==SBomber)||(Fli[i+10].Typ==SFighter))
  650.         PasteGfxNoMask2(480+(i*15), 17, 10, 5, EnergZahl+(50*(20-(Fli[i+10].Energie*2))));
  651.       else
  652.         PasteGfxNoMask2(480+(i*15), 17, 10, 5, EnergZahl+(50*(20-Fli[i+10].Energie)));
  653.       }
  654.     else {
  655.       Schwarz(475+(i*15), 13, 485+(i*15), 22);
  656.       }
  657.     }
  658.  
  659.   if(LS[0].Energie>0) {
  660.     PasteGfxNoMask2(280, 7, 6, 6, GrLaser);
  661.     PasteGfxNoMask2(280, 17, 10, 5, EnergZahl+(50*(20-(LS[0].Energie/4))));
  662.     }
  663.   else {
  664.     Schwarz(273, 0, 287, 22);
  665.     }
  666.  
  667.   if(LS[1].Energie>0) {
  668.     PasteGfxNoMask2(300, 7, 6, 6, Schild);
  669.     PasteGfxNoMask2(300, 17, 10, 5, EnergZahl+(50*(20-(LS[1].Energie/4))));
  670.     }
  671.   else {
  672.     Schwarz(293, 0, 307, 22);
  673.     }
  674.  
  675.   if(LS[2].Energie>0) {
  676.     PasteGfxNoMask2(340, 7, 6, 6, BlLaser);
  677.     PasteGfxNoMask2(340, 17, 10, 5, EnergZahl+(50*(20-(LS[2].Energie/4))));
  678.     }
  679.   else {
  680.     Schwarz(333, 0, 347, 22);
  681.     }
  682.   if(LS[3].Energie>0) {
  683.     PasteGfxNoMask2(360, 7, 6, 6, Schild);
  684.     PasteGfxNoMask2(360, 17, 10, 5, EnergZahl+(50*(20-(LS[3].Energie/4))));
  685.     }
  686.   else {
  687.     Schwarz(353, 0, 367, 22);
  688.     }
  689.  
  690.  
  691.   }
  692.  
  693. // ------------------------------------------------------------------------------------------------
  694. // Refresht die Zahlen der Raumer (ob aktiv oder nich)
  695. //
  696. // Parameter:     -Keine-
  697. //
  698. // globale Var's: UBYTE *GameScr                (initialisierter Zeiger auf anzuzeigendes Bild)
  699. //                struct Raumer Fli[20]         (Array von Raumerstrukturen für Verwaltung)
  700.  
  701. void RefreshZahl(void) {
  702.   int i;
  703.  
  704.   for(i=0; i<10; i++) {
  705.     if(Fli[i].Aktiv) PasteGfxNoMask2(10+(i*15), 6, 10, 10, (GfxTab+(3701+(100*i))));
  706.     else if(Fli[i].Befehl) PasteGfxNoMask2(10+(i*15), 6, 10, 10, (GfxTab+(4701+(100*i))));
  707.     else if(!Fli[i].Aktiv) PasteGfxNoMask2(10+(i*15), 6, 10, 10, (GfxTab+(2701+(100*i))));
  708.     if(Fli[i].Typ==Tot) Schwarz(5+(i*15), 0, 15+(i*15), 11);
  709.  
  710.     if(Fli[i+10].Aktiv) PasteGfxNoMask2(480+(i*15), 6, 10, 10, GfxTab+(3701+(100*i)));
  711.     else if(Fli[i+10].Befehl) PasteGfxNoMask2(480+(i*15), 6, 10, 10, GfxTab+(4701+(100*i)));
  712.     else if(!Fli[i+10].Aktiv) PasteGfxNoMask2(480+(i*15), 6, 10, 10, GfxTab+(2701+(100*i)));
  713.     if(Fli[i+10].Typ==Tot) Schwarz(475+(i*15), 0, 485+(i*15), 11);
  714.     }
  715.   }
  716.  
  717. // ------------------------------------------------------------------------------------------------
  718. // Initialisiert den ganzen Kuddelmuddel
  719. //
  720. // Parameter:     -Keine-
  721. //
  722. // globale Var's: -ziemlich alle-
  723.  
  724. void InitAlles(void) {
  725.   LONG i;
  726.  
  727.   // AHI initialisieren
  728.   if(!OpenAHI()) {
  729.     Printf("OpenAHI() failed. (AHI V4)\n");
  730.     AllesZu(65535);
  731.     }
  732.  
  733.   if(!AllocAudio()) {
  734.     Printf("AllocAudio() failed.\n");
  735.     AllesZu(65535);
  736.     }
  737.  
  738.   // Alle Samples einladen
  739.  
  740.   SND_StatLaser  = LoadSample("Daten/snd1", AHIST_M8S);
  741.   SND_BombExplo  = LoadSample("Daten/snd2", AHIST_M8S);
  742.   SND_RaumerExplo= LoadSample("Daten/snd3", AHIST_M8S);
  743.   SND_FightLaser = LoadSample("Daten/snd4", AHIST_M8S);
  744.   SND_SFightLaser= LoadSample("Daten/snd5", AHIST_M8S);
  745.   SND_BombShot   = LoadSample("Daten/snd6", AHIST_M8S);
  746.   SND_Schaf      = LoadSample("Daten/snd7", AHIST_M8S);
  747.   SND_Knaller    = LoadSample("Daten/snd8", AHIST_M8S);
  748.  
  749.   for(i=0; i<MAXSAMPLES; i++) {
  750.     if(SmpID[i]==AHI_NOSOUND) {
  751.       Printf("LoadSample() failed.\n");
  752.       AllesZu(65535);
  753.       }
  754.     }
  755.  
  756.   if(AHI_ControlAudio(actrl, AHIC_Play, TRUE, TAG_DONE)) {
  757.     Printf("AHI_ControlAudio() failed. \n");
  758.     AllesZu(65535);
  759.     }
  760.  
  761.   // RTGMaster initialisieren
  762.   RTGMasterBase=(struct Library *)OpenLibrary("rtgmaster.library",40);
  763.   LowLevelBase=(struct Library *)OpenLibrary("lowlevel.library",40);
  764.  
  765.   if (!RTGMasterBase) {
  766.       Printf("OpenLibrary() failed. (rtgmaster.library V40)\n");
  767.       AllesZu(65535);
  768.       }
  769.  
  770.   if (!LowLevelBase) {
  771.       Printf("OpenLibrary() failed. (lowlevel.library V40)\n");
  772.       AllesZu(65535);
  773.       }
  774.  
  775.   // Screenmoderequester
  776.   #ifndef __PPC__
  777.       sr=RtgScreenModeReq(rtag);
  778.   #else
  779.       sr=PPCRtgScreenModeReq(rtag);
  780.   #endif
  781.  
  782.   if (!sr) {
  783.       Printf("RtgScreenModeReq() failed.\n");
  784.       AllesZu(65535);
  785.       }
  786.  
  787.   // Open Screen
  788.   #ifndef __PPC__
  789.       RScreen = OpenRtgScreen(sr,tacks);
  790.   #else
  791.       RScreen = PPCOpenRtgScreen(sr,tacks);
  792.   #endif
  793.  
  794.   if (!RScreen) {
  795.       Printf("OpenRtgScreen() failed.\n");
  796.       AllesZu(65535);
  797.       }
  798.  
  799.   // Screendaten holen
  800.   #ifndef __PPC__
  801.       MapA=(UBYTE *)GetBufAdr(RScreen,0);
  802.       GetRtgScreenData(RScreen,gtag);
  803.   #else
  804.       MapA=(UBYTE *)PPCGetBufAdr(RScreen,0);
  805.       PPCGetRtgScreenData(RScreen,gtag);
  806.   #endif
  807.  
  808.   // Speicher reservieren
  809.  
  810.   Palette = (LONG *) AllocMem(4000, MEMF_FAST|MEMF_CLEAR);       // Speicher für Palette
  811.   Wurzel  = (ULONG *) AllocMem(160000, MEMF_FAST|MEMF_CLEAR);    // Speicher für Wurzeltabellen
  812.   Buffer  = (UBYTE *) AllocMem(4000, MEMF_FAST|MEMF_CLEAR);      // Speicher zum Einladen und konvertieren der Palette
  813.   GameScr = (UBYTE *) AllocMem(340000, MEMF_FAST|MEMF_CLEAR);    // Speicher für den GameScreen
  814.   GfxTab  = (UBYTE *) AllocMem(20000, MEMF_FAST|MEMF_CLEAR);     // Speicher für die Grafiken
  815.   Titel   = (UBYTE *) AllocMem(60000, MEMF_FAST|MEMF_CLEAR);     // Speicher für die Titel-Optik
  816.   Pause   = (UBYTE *) AllocMem(1000, MEMF_FAST|MEMF_CLEAR);      // Speicher für Pause-Schrift
  817.   Schaf   = (UBYTE *) AllocMem(20000, MEMF_FAST|MEMF_CLEAR);      // Speicher für Schaf-Anims
  818.  
  819.   if((!Palette)||(!Buffer)||(!GameScr)||(!GfxTab)||(!Wurzel)||(!Titel)||(!Pause)) {
  820.     Printf("AllocMem() failed. (~1MB unfragmented FastRAM needed).\n");
  821.     AllesZu(65535);
  822.     }
  823.  
  824.   // Laden des ganzen Kuddelmuddel's
  825.  
  826.   LadeFile("Daten/Pal", Buffer, 4000);
  827.   LadeFile("Daten/Gfx", GfxTab, 20000);
  828.   LadeFile("Daten/sqr", Wurzel, 160000);
  829.   LadeFile("Daten/gfx2", Titel, 60000);
  830.   LadeFile("Daten/gfx3", Pause, 1000);
  831.   LadeFile("Daten/specialgfx", Schaf, 20000);
  832.  
  833.   // Farbpalette initialisieren
  834.  
  835.   *Palette = 0x00200000;
  836.   for(i=0; i<95; i++) {
  837.     *(Palette+1+i)=*(Buffer+48+i)*0x01010101;
  838.     }
  839.   LoadRGBRtg(RScreen, Palette);
  840.  
  841.   // Keyboard-Abfragen initialisieren
  842.  
  843.   for(i=0; i<20; i++) {
  844.     kq[i].kq_Pressed=FALSE;
  845.     if(i<10) kq[i].kq_KeyCode=80+i;
  846.     }
  847.  
  848.   kq[19].kq_KeyCode=15;  // Numerische Taste 0
  849.   kq[10].kq_KeyCode=29;  // Numerische Taste 1
  850.   kq[11].kq_KeyCode=30;  // Numerische Taste 2
  851.   kq[12].kq_KeyCode=31;  // Numerische Taste 3
  852.   kq[13].kq_KeyCode=45;  // Numerische Taste 4
  853.   kq[14].kq_KeyCode=46;  // Numerische Taste 5
  854.   kq[15].kq_KeyCode=47;  // Numerische Taste 6
  855.   kq[16].kq_KeyCode=61;  // Numerische Taste 7
  856.   kq[17].kq_KeyCode=62;  // Numerische Taste 8
  857.   kq[18].kq_KeyCode=63;  // Numerische Taste 9
  858.   kq[20].kq_KeyCode=76;  // Pfeiltaste Hoch
  859.   kq[21].kq_KeyCode=77;  // Pfeiltaste Runter
  860.   kq[22].kq_KeyCode=78;  // Pfeiltaste Rechts
  861.   kq[23].kq_KeyCode=79;  // Pfeiltaste Links
  862.   kq[24].kq_KeyCode=39;  // Taste "k"
  863.  
  864.  
  865.   for(i=0; i<640; i++) {
  866.     *(MapA+(23*640)+i)=21;
  867.     *(MapA+(24*640)+i)=23;
  868.     *(MapA+(478*640)+i)=23;
  869.     }
  870.  
  871.   for(i=0; i<23; i++) {
  872.     *(MapA+(i*640)+318)=23;
  873.     *(MapA+(i*640)+319)=21;
  874.     *(MapA+(i*640)+320)=23;
  875.     }
  876.  
  877.   for(i=24; i<480; i++) {
  878.     *(MapA+(i*640))=23;
  879.     *(MapA+(i*640)+639)=23;
  880.     }
  881.  
  882.   RefreshZahl();
  883.   RefreshREnerg();
  884.   RefreshWand();
  885.   }
  886.  
  887. // ------------------------------------------------------------------------------------------------
  888. // Refresht den Game-Screen (zeigt fertiges Bild an)
  889. //
  890. // Parameter:     -Keine-
  891. //
  892. // globale Var's: struct RTGScreen *RScreen     (initialisierter Zeiger auf einen RTGScreen)
  893. //                UBYTE *MapA                   (initialisierter Zeiger auf Pufferadresse des RTGScreens)
  894. //                UBYTE *GameScr                (initialisierter Zeiger auf anzuzeigendes Bild)
  895.  
  896. void Klatsch() {
  897.   #ifndef __PPC__
  898.     CopyRtgBlit(RScreen,MapA,GameScr,0,0,0,640,480,640,480,0,0);
  899.   #else
  900.     PPCCopyRtgBlit(RScreen,MapA,GameScr,0,0,0,640,480,640,480,0,0);
  901.   #endif
  902.   }
  903.  
  904. // ------------------------------------------------------------------------------------------------
  905. // Erzeugt eine Explosion mit Feuer, Funkenflug etc. mit variabler Größe
  906. //
  907. // Parameter:     LONG x                        (X-Koordinate der zu erstellenden Explosion)
  908. //                LONG y                        (Y-Koordinate der zu erstellenden Explosion)
  909. //                UBYTE Dicke                   (Größe der Explosion [siehe Definition: Explosionsgrößen)
  910. //
  911. // globale Var's: struct Raumer Fli[20]         (Array von Raumerstrukturen für Verwaltung)
  912.  
  913. void Kawomm(LONG x, LONG y, UBYTE Dicke) {
  914.   register UBYTE i, j, k;
  915.   register LONG zx, zy, x2, y2, t;
  916.  
  917.   if(Dicke==Mini) {
  918.     for(i=0; i<6; i++) {
  919.       zx=(-768+(rand()%1536));
  920.       zy=(-768+(rand()%1536));
  921.       NeuesObjekt(Funke, x, y, zx, zy, 0);
  922.       }
  923.     }
  924.  
  925.  
  926.   if(Dicke==Winzig) {
  927.     for(k=0; k<20; k++) {
  928.       if((Fli[k].Typ!=Tot)&&(!Fli[k].Raucher)) {
  929.         zx=x-(Fli[k].RealX>>8);
  930.         zy=y-(Fli[k].RealY>>8);
  931.  
  932.         t=((zx*zx)+(zy*zy));
  933.         if(t<400) {
  934.           Fli[k].Energie-=((20-*(Wurzel+t))>>1);
  935.           if(Fli[k].Energie<1) {
  936.             Fli[k].Raucher=TRUE;
  937.             Fli[k].MaxEnergie=40+Fli[k].Energie;
  938.             }
  939.           }
  940.         }
  941.       }
  942.     // Laserstationen betroffen?
  943.     for(k=0; k<4; k++) {
  944.       zx=x-LS[k].RealX;
  945.       zy=y-LS[k].RealY;
  946.       t=((zx*zx)+(zy*zy));
  947.       if(t<400) {
  948.         LS[k].Energie-=((20-*(Wurzel+t))>>1);
  949.         if((LS[k].Energie<0)&&(LS[k].Energie!=-20)) LS[k].Energie=0;
  950.         }
  951.       }
  952.  
  953.     NeuesObjekt(Explosion, x, y, 0, 0, 0);
  954.  
  955.  
  956.     for(i=0; i<20; i++) {
  957.       zx=(-768+(rand()%1536))*2;
  958.       zy=(-768+(rand()%1536))*2;
  959.       NeuesObjekt(Funke, x, y, zx, zy, 0);
  960.       }
  961.     }
  962.  
  963.   if(Dicke==Mittel) {
  964.     for(k=0; k<20; k++) {
  965.       if((Fli[k].Typ!=Tot)&&(!Fli[k].Raucher)) {
  966.         zx=x-(Fli[k].RealX>>8);
  967.         zy=y-(Fli[k].RealY>>8);
  968.  
  969.         t=((zx*zx)+(zy*zy));
  970.         if(t<1600) {
  971.           Fli[k].Energie-=(40-*(Wurzel+t));
  972.           if(Fli[k].Energie<1) {
  973.             Fli[k].Raucher=TRUE;
  974.             Fli[k].MaxEnergie=40+Fli[k].Energie;
  975.             }
  976.           }
  977.         }
  978.       }
  979.     // Laserstationen betroffen?
  980.     for(k=0; k<4; k++) {
  981.       zx=x-LS[k].RealX;
  982.       zy=y-LS[k].RealY;
  983.       t=((zx*zx)+(zy*zy));
  984.       if(t<1600) {
  985.         LS[k].Energie-=(40-*(Wurzel+t));
  986.         if((LS[k].Energie<0)&&(LS[k].Energie!=-20)) LS[k].Energie=0;
  987.         }
  988.       }
  989.  
  990.     for(i=0; i<20; i++) {
  991.  
  992.       zx=(x-30)+(rand()%60);
  993.       zy=(y-30)+(rand()%60);
  994.  
  995.       NeuesObjekt(Explosion, zx, zy, 0, 0, *(Wurzel + ((zx-x)*(zx-x)+(zy-y)*(zy-y)))/5);
  996.       }
  997.  
  998.     for(i=0; i<20; i++) {
  999.       zx=(-768+(rand()%1536))*2;
  1000.       zy=(-768+(rand()%1536))*2;
  1001.       NeuesObjekt(Funke, x, y, zx, zy, 0);
  1002.       }
  1003.     }
  1004.  
  1005.   if(Dicke==Gross) {
  1006.     for(k=0; k<20; k++) {
  1007.       if((Fli[k].Typ!=Tot)&&(!Fli[k].Raucher)) {
  1008.         zx=x-(Fli[k].RealX>>8);
  1009.         zy=y-(Fli[k].RealY>>8);
  1010.  
  1011.         t=((zx*zx)+(zy*zy));
  1012.         if(t<2500) {
  1013.           Fli[k].Energie-=(50-*(Wurzel+t));
  1014.           if(Fli[k].Energie<1) {
  1015.             Fli[k].Raucher=TRUE;
  1016.             Fli[k].MaxEnergie=40+(Fli[k].Energie>>1);
  1017.             }
  1018.           }
  1019.         }
  1020.       }
  1021.     // Laserstationen betroffen?
  1022.     for(k=0; k<4; k++) {
  1023.       zx=x-LS[k].RealX;
  1024.       zy=y-LS[k].RealY;
  1025.       t=((zx*zx)+(zy*zy));
  1026.       if(t<2500) {
  1027.         LS[k].Energie-=(50-*(Wurzel+t));
  1028.         if((LS[k].Energie<0)&&(LS[k].Energie!=-20)) LS[k].Energie=0;
  1029.         }
  1030.       }
  1031.  
  1032.     for(i=0; i<35; i++) {
  1033.       zx=(x-35)+(rand()%70);
  1034.       zy=(y-35)+(rand()%70);
  1035.  
  1036.       NeuesObjekt(Explosion, zx, zy, 0, 0, *(Wurzel + ((zx-x)*(zx-x)+(zy-y)*(zy-y)))/7);
  1037.       }
  1038.  
  1039.     for(i=0; i<40; i++) {
  1040.       zx=(-768+(rand()%1536))*4;
  1041.       zy=(-768+(rand()%1536))*4;
  1042.       NeuesObjekt(Funke, x, y, zx, zy, 0);
  1043.       }
  1044.     }
  1045.  
  1046.   if(Dicke==GeradezuUnglaublich) {
  1047.     for(i=0; i<10; i++) {
  1048.       x2=(x-20)+(rand()%40);
  1049.       y2=(y-50)+(rand()%100);
  1050.  
  1051.       if((x2>0)&&(x2<639)&&(y2>0)&&(y2<479)) Kawomm(x2, y2, Mittel);
  1052.       }
  1053.     }
  1054.   RefreshREnerg();
  1055.   }
  1056.  
  1057. // ------------------------------------------------------------------------------------------------
  1058. // Erzeugt eine neues Objekt (Explosion, Rauch, Funken) in der Arena
  1059. //
  1060. // Parameter:     UBYTE Type                    (Objekttyp [siehe Objektdefinitionen und struct Objekt])
  1061. //                LONG x                        (X-Koordinate des zu erzeugenden Objekts)
  1062. //                LONG y                        (Y-Koordinate des zu erzeugenden Objekts)
  1063. //                LONG rx                       (Kurs in X-Richtung des zu erzeugenden Objekts)
  1064. //                LONG ry                       (Kurs in Y-Richtung des zu erzeugenden Objekts)
  1065. //
  1066. // globale Var's: struct Objekt Obj[500]        (Array von Objektstrukturen zur Objektverwaltung)
  1067.  
  1068. void NeuesObjekt(UBYTE Type, LONG x, LONG y, LONG rx, LONG ry, LONG Pause) {
  1069.   int Zahl=0;
  1070.  
  1071.   while((Obj[Zahl].Typ!=Frei)&&(Zahl<500)) { Zahl++; }   // freies Objekt suchen
  1072.   if(Zahl>498) return;  // kein freies mehr da --> Pech gehabt
  1073.  
  1074.   // den ganzen Quatsch initialisieren
  1075.  
  1076.   Obj[Zahl].Typ=Type;
  1077.   if(Type==Funke) Obj[Zahl].MaxZeit=LBStFunken;
  1078.   if(Type==Explosion) Obj[Zahl].MaxZeit=LBStExplo;
  1079.   if(Type==Rauch) Obj[Zahl].MaxZeit=LBStSmoke;
  1080.   Obj[Zahl].Zeit=Obj[Zahl].MaxZeit;
  1081.   Obj[Zahl].RealX=x<<8;
  1082.   Obj[Zahl].RealY=y<<8;
  1083.   Obj[Zahl].KursX=rx;
  1084.   Obj[Zahl].KursY=ry;
  1085.   Obj[Zahl].Pause=Pause;
  1086.   }
  1087.  
  1088. // ------------------------------------------------------------------------------------------------
  1089. // Verwaltet alle Objekte (Explosionen, Rauch, Funken)
  1090. //
  1091. // Parameter:     -Keine-
  1092. //
  1093. // globale Var's: struct Objekt Obj[500]        (Array von Objektstrukturen zur Objektverwaltung)
  1094. //                UBYTE *GameScr                (initialisierter Zeiger auf anzuzeigendes Bild)
  1095.  
  1096. void MachMaObjekte() {
  1097.   int ObjNr;
  1098.  
  1099.   for(ObjNr=0; ObjNr<500; ObjNr++) {
  1100.     if(Obj[ObjNr].Typ!=Frei) {
  1101.       if (Obj[ObjNr].Pause>0) {
  1102.         Obj[ObjNr].Pause--;
  1103.         }
  1104.       else
  1105.         {
  1106.  
  1107.         // Alle Objekte erstmal weg vom Screen
  1108.         if(Obj[ObjNr].Typ==Funke) {
  1109.           if((Obj[ObjNr].RealX>1<<8)&&(Obj[ObjNr].RealX<639<<8)&&(Obj[ObjNr].RealY>25<<8)&&(Obj[ObjNr].RealY<478<<8)) {
  1110.             *(MapA+((Obj[ObjNr].RealY>>8)*640)+(Obj[ObjNr].RealX>>8))=0;
  1111.             }
  1112.           }
  1113.  
  1114.         if(Obj[ObjNr].Typ==Explosion) {
  1115.           if(Obj[ObjNr].Zeit==6) RemoveGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 18, 18, ExploFr3);
  1116.           if(Obj[ObjNr].Zeit==5) RemoveGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 18, 18, ExploFr1);
  1117.           if(Obj[ObjNr].Zeit==4) RemoveGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 18, 18, ExploFr1);
  1118.           if(Obj[ObjNr].Zeit==3) RemoveGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 18, 18, ExploFr2);
  1119.           if(Obj[ObjNr].Zeit==2) RemoveGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 18, 18, ExploFr3);
  1120.           if(Obj[ObjNr].Zeit==1) RemoveGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 18, 18, ExploFr4);
  1121.           }
  1122.  
  1123.         if(Obj[ObjNr].Typ==Rauch) {
  1124.           if(Obj[ObjNr].Zeit==5) RemoveGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 3, 3, SmokeFr1);
  1125.           if(Obj[ObjNr].Zeit==4) RemoveGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 3, 3, SmokeFr2);
  1126.           if(Obj[ObjNr].Zeit==3) RemoveGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 5, 5, SmokeFr3);
  1127.           if(Obj[ObjNr].Zeit==2) RemoveGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 7, 7, SmokeFr4);
  1128.           if(Obj[ObjNr].Zeit==1) RemoveGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 7, 7, SmokeFr5);
  1129.           }
  1130.  
  1131.         // Jetzt rechnen und organisieren und gucken und bla und bla und bla
  1132.  
  1133.         Obj[ObjNr].Zeit--;
  1134.  
  1135.         if((Obj[ObjNr].Zeit<1)||(Obj[ObjNr].Zeit>15)) {
  1136.           Obj[ObjNr].Typ=Frei; }
  1137.         else {
  1138.           Obj[ObjNr].RealX+=Obj[ObjNr].KursX;
  1139.           Obj[ObjNr].RealY+=Obj[ObjNr].KursY;
  1140.           }
  1141.  
  1142.         if((Obj[ObjNr].RealX<-512)||(Obj[ObjNr].RealX>640<<8)||(Obj[ObjNr].RealY<24<<8)||(Obj[ObjNr].RealY>480<<8)) Obj[ObjNr].Typ=Frei;
  1143.  
  1144.         // Jetzt wieder alles gnadenlos auf den Screen zaubern
  1145.  
  1146.         if(Obj[ObjNr].Typ==Funke) {
  1147.           if((Obj[ObjNr].RealX>1<<8)&&(Obj[ObjNr].RealX<639<<8)&&(Obj[ObjNr].RealY>25<<8)&&(Obj[ObjNr].RealY<478<<8)) {
  1148.             *(MapA+((Obj[ObjNr].RealY>>8)*640)+(Obj[ObjNr].RealX>>8))=(15-Obj[ObjNr].Zeit);
  1149.             }
  1150.           }
  1151.  
  1152.         if(Obj[ObjNr].Typ==Explosion) {
  1153.           if(Obj[ObjNr].Zeit==6) PasteGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 18, 18, ExploFr3);
  1154.           if(Obj[ObjNr].Zeit==5) PasteGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 18, 18, ExploFr1);
  1155.           if(Obj[ObjNr].Zeit==4) PasteGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 18, 18, ExploFr1);
  1156.           if(Obj[ObjNr].Zeit==3) PasteGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 18, 18, ExploFr2);
  1157.           if(Obj[ObjNr].Zeit==2) PasteGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 18, 18, ExploFr3);
  1158.           if(Obj[ObjNr].Zeit==1) PasteGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 18, 18, ExploFr4);
  1159.           }
  1160.         if(Obj[ObjNr].Typ==Rauch) {
  1161.           if(Obj[ObjNr].Zeit==5) PasteGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 3, 3, SmokeFr1);
  1162.           if(Obj[ObjNr].Zeit==4) PasteGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 3, 3, SmokeFr2);
  1163.           if(Obj[ObjNr].Zeit==3) PasteGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 5, 5, SmokeFr3);
  1164.           if(Obj[ObjNr].Zeit==2) PasteGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 7, 7, SmokeFr4);
  1165.           if(Obj[ObjNr].Zeit==1) PasteGfx(Obj[ObjNr].RealX>>8, Obj[ObjNr].RealY>>8, 7, 7, SmokeFr5);
  1166.           }
  1167.         }
  1168.       }
  1169.     }
  1170.   }
  1171.  
  1172. // ------------------------------------------------------------------------------------------------
  1173. // Lädt eine Datei in den RAM
  1174. //
  1175. // Parameter:     STRPTR Datei                  (STRPTR auf den Dateinamen)
  1176. //                APTR ZielBuffer               (Pointer auf die Zieladresse)
  1177. //                LONG Laenge                   (Länge der einzuladenden Datei)
  1178. //
  1179. // globale Var's: -Keine-
  1180.  
  1181. void LadeFile(STRPTR Datei, APTR ZielBuffer, LONG Laenge) {
  1182.   LONG file=NULL;
  1183.  
  1184.   file=Open(Datei, MODE_OLDFILE);
  1185.   if(file==NULL) {
  1186.     Printf("Open() failed. (file <%s>).\n", Datei);
  1187.     AllesZu(65535);
  1188.     }
  1189.   Read(file, ZielBuffer, Laenge);
  1190.   Close(file);
  1191.   }
  1192.  
  1193. // ------------------------------------------------------------------------------------------------
  1194. // Schließt allen Müll und gibt den RAM endlich wieder frei für sinnvolle Zwecke
  1195. //
  1196. // Parameter:     LONG FehlerCode               (FehlerCode, der beim Verlassen des Progs den User stört)
  1197. //
  1198. // globale Var's: -das werde ich mir jetzt mal großzügig sparen-
  1199.  
  1200. void AllesZu(LONG FehlerCode) {
  1201.   // AHI aufhalten und niederringen
  1202.  
  1203.   if(actrl) AHI_ControlAudio(actrl, AHIC_Play, FALSE, TAG_DONE);
  1204.   for(UBYTE d=0; d<MAXSAMPLES; d++) UnloadSample(d);
  1205.   FreeAudio();
  1206.   CloseAHI();
  1207.  
  1208.   // Speicher freigeben
  1209.  
  1210.   if(GameScr) FreeMem(GameScr, 340000);
  1211.   if(Palette) FreeMem(Palette, 4000);
  1212.   if(Buffer)  FreeMem(Buffer , 4000);
  1213.   if(GfxTab)  FreeMem(GfxTab , 20000);
  1214.   if(Wurzel)  FreeMem(Wurzel , 160000);
  1215.   if(Titel)   FreeMem(Titel  , 60000);
  1216.   if(Pause)   FreeMem(Pause  , 1000);
  1217.   if(Schaf)   FreeMem(Schaf  , 20000);
  1218.  
  1219.   // RTGMaster zurückrufen  (Ruuuuuhig, Brauner! Ist ja nur 'n Gewitter.)
  1220.  
  1221.   #ifndef __PPC__
  1222.       if (RScreen) CloseRtgScreen(RScreen);
  1223.       if (sr) FreeRtgScreenModeReq(sr);
  1224.   #else
  1225.       if (RScreen) PPCCloseRtgScreen(RScreen);
  1226.       if (sr) PPCFreeRtgScreenModeReq(sr);
  1227.   #endif
  1228.  
  1229.   // Librarys schließen
  1230.  
  1231.   if (RTGMasterBase) CloseLibrary((struct Library *) RTGMasterBase);
  1232.   if (LowLevelBase) CloseLibrary((struct Library *) LowLevelBase);
  1233.  
  1234.   // Jetzt ist Schulz
  1235.  
  1236.   if(FehlerCode>0) Printf("Game killed.\n");
  1237.   exit(FehlerCode);
  1238.   }
  1239.  
  1240. // ------------------------------------------------------------------------------------------------
  1241. // Schreibt Umriß mit angegebener Farbe
  1242. //
  1243. // Parameter:     LONG ZielX                    (X-Koordinate des Zielpunktes der Grafik)
  1244. //                LONG ZielY                    (Y-Koordinate des Zielpunktes der Grafik)
  1245. //                LONG Breite                   (Breite der anzuzeigenden Grafik)
  1246. //                LONG Hoehe                    (Höhe der anzuzeigenden Grafik)
  1247. //                UBYTE *GfxData                (Zeiger auf die Grafikdaten im Chunky-Format)
  1248. //                UBYTE Farbe
  1249.  
  1250. // globale Var's: UBYTE *GameScr                (initialisierter Zeiger auf anzuzeigendes Bild)
  1251.  
  1252. void Umriss(LONG ZielX, LONG ZielY, LONG Breite, LONG Hoehe, UBYTE *GfxData, UBYTE Farbe) {
  1253.   ZielY-=(Hoehe>>1); ZielX-=(Breite>>1);
  1254.   UBYTE *TempPtr;
  1255.  
  1256.   for(UWORD i=0; i<Hoehe; i++) {
  1257.     TempPtr=MapA+((ZielY+i)*640)+ZielX;
  1258.     for(UWORD j=0; j<Breite; j++) {
  1259.       if(*GfxData) *TempPtr=Farbe;
  1260.       GfxData++; TempPtr++;
  1261.       }
  1262.     }
  1263.   }
  1264.  
  1265. // ------------------------------------------------------------------------------------------------
  1266. // Schreibt Grafik auf den Game-Screen zur späteren Anzeige per Klatsch() (Mittelpunkt angeben !!!!)
  1267. //
  1268. // Parameter:     LONG ZielX                    (X-Koordinate des Zielpunktes der Grafik)
  1269. //                LONG ZielY                    (Y-Koordinate des Zielpunktes der Grafik)
  1270. //                LONG Breite                   (Breite der anzuzeigenden Grafik)
  1271. //                LONG Hoehe                    (Höhe der anzuzeigenden Grafik)
  1272. //                UBYTE *GfxData                (Zeiger auf die Grafikdaten im Chunky-Format)
  1273. //
  1274. // globale Var's: UBYTE *GameScr                (initialisierter Zeiger auf anzuzeigendes Bild)
  1275.  
  1276. void PasteGfx(LONG ZielX, LONG ZielY, LONG Breite, LONG Hoehe, UBYTE *GfxData) {
  1277.   ZielY-=(Hoehe>>1); ZielX-=(Breite>>1);
  1278.   UBYTE *TempPtr;
  1279.  
  1280.   if((ZielX>1)&&(ZielY>25)&&((ZielX+Breite)<638)&&((ZielY+Hoehe)<477)) {
  1281.     for(UWORD i=0; i<Hoehe; i++) {
  1282.       TempPtr=MapA+((ZielY+i)*640)+ZielX;
  1283.       for(UWORD j=0; j<Breite; j++) {
  1284.         if(*GfxData) *TempPtr=*GfxData;
  1285.         GfxData++; TempPtr++;
  1286.         }
  1287.       }
  1288.     }
  1289.   else {
  1290.     for(UWORD i=0; i<Hoehe; i++) {
  1291.       TempPtr=MapA+((ZielY+i)*640)+ZielX;
  1292.       for(UWORD j=0; j<Breite; j++) {
  1293.         if(*GfxData) {
  1294.           if((ZielY+i>25)&&(ZielX+j>1)&&(ZielX+j<638)&&(ZielY+i<477)) *TempPtr=*GfxData;
  1295.           }
  1296.         GfxData++; TempPtr++;
  1297.         }
  1298.       }
  1299.     }
  1300.   }
  1301.  
  1302. // ------------------------------------------------------------------------------------------------
  1303. // Schreibt Grafik auf den Game-Screen (Diesmal ohne Maske, auch Schwarze werden gemalt) (Mittelpunkt!!!!!!!)
  1304. //
  1305. // Parameter:     LONG ZielX                    (X-Koordinate des Zielpunktes der Grafik)
  1306. //                LONG ZielY                    (Y-Koordinate des Zielpunktes der Grafik)
  1307. //                LONG Breite                   (Breite der anzuzeigenden Grafik)
  1308. //                LONG Hoehe                    (Höhe der anzuzeigenden Grafik)
  1309. //                UBYTE *GfxData                (Zeiger auf die Grafikdaten im Chunky-Format)
  1310. //
  1311. // globale Var's: UBYTE *GameScr                (initialisierter Zeiger auf anzuzeigendes Bild)
  1312.  
  1313. void PasteGfxNoMask(LONG ZielX, LONG ZielY, LONG Breite, LONG Hoehe, UBYTE *GfxData) {
  1314.   ZielY-=(Hoehe>>1); ZielX-=(Breite>>1);
  1315.   UBYTE *TempPtr;
  1316.  
  1317.   for(UWORD i=0; i<Hoehe; i++) {
  1318.     TempPtr=MapA+((ZielY+i)*640)+ZielX;
  1319.     for(UWORD j=0; j<Breite; j++) {
  1320.       *TempPtr=*GfxData;
  1321.       GfxData++; TempPtr++;
  1322.       }
  1323.     }
  1324.   }
  1325.  
  1326. // ------------------------------------------------------------------------------------------------
  1327. // Wie PasteGfxNoMask() jedoch kann hier schon ab Zeile 0 gemalt werden, und nicht erst ab 25
  1328. //
  1329. // Parameter:     LONG ZielX                    (X-Koordinate des Zielpunktes der Grafik)
  1330. //                LONG ZielY                    (Y-Koordinate des Zielpunktes der Grafik)
  1331. //                LONG Breite                   (Breite der anzuzeigenden Grafik)
  1332. //                LONG Hoehe                    (Höhe der anzuzeigenden Grafik)
  1333. //                UBYTE *GfxData                (Zeiger auf die Grafikdaten im Chunky-Format)
  1334. //
  1335. // globale Var's: UBYTE *GameScr                (initialisierter Zeiger auf anzuzeigendes Bild)
  1336.  
  1337. void PasteGfxNoMask2(LONG ZielX, LONG ZielY, LONG Breite, LONG Hoehe, UBYTE *GfxData) {
  1338.   ZielY-=(Hoehe>>1); ZielX-=(Breite>>1);
  1339.   UBYTE *TempPtr;
  1340.  
  1341.   for(UWORD i=0; i<Hoehe; i++) {
  1342.     TempPtr=MapA+((ZielY+i)*640)+ZielX;
  1343.     for(UWORD j=0; j<Breite; j++) {
  1344.       *TempPtr=*GfxData;
  1345.       GfxData++; TempPtr++;
  1346.       }
  1347.     }
  1348.   }
  1349.  
  1350.  
  1351. // ------------------------------------------------------------------------------------------------
  1352. // Löscht eine Grafik vom Game-Screen (wieder den Mittelpunkt angeben !!!!)
  1353. //
  1354. // Parameter:     LONG ZielX                    (X-Koordinate des Zielpunktes der Grafik)
  1355. //                LONG ZielY                    (Y-Koordinate des Zielpunktes der Grafik)
  1356. //                LONG Breite                   (Breite der zu löschenden Grafik)
  1357. //                LONG Hoehe                    (Höhe der zu löschenden Grafik)
  1358. //                UBYTE *GfxData                (Zeiger auf die Grafikdaten im Chunky-Format)
  1359. //
  1360. // globale Var's: UBYTE *GameScr                (initialisierter Zeiger auf anzuzeigendes Bild)
  1361.  
  1362. void RemoveGfx(LONG ZielX, LONG ZielY, LONG Breite, LONG Hoehe, UBYTE *GfxData) {
  1363.   ZielY-=(Hoehe>>1); ZielX-=(Breite>>1);
  1364.   UBYTE *TempPtr;
  1365.  
  1366.   if((ZielX>1)&&(ZielY>25)&&((ZielX+Breite)<638)&&((ZielY+Hoehe)<477)) {
  1367.     for(UWORD i=0; i<Hoehe; i++) {
  1368.       TempPtr=MapA+((ZielY+i)*640)+ZielX;
  1369.       for(UWORD j=0; j<Breite; j++) {
  1370.         if(*GfxData) *TempPtr=0;
  1371.         GfxData++; TempPtr++;
  1372.         }
  1373.       }
  1374.     }
  1375.   else {
  1376.     for(UWORD i=0; i<Hoehe; i++) {
  1377.       TempPtr=MapA+((ZielY+i)*640)+ZielX;
  1378.       for(UWORD j=0; j<Breite; j++) {
  1379.         if(*GfxData) {
  1380.           if((ZielY+i>25)&&(ZielX+j>1)&&(ZielX+j<638)&&(ZielY+i<477)) *TempPtr=0;
  1381.           }
  1382.         GfxData++; TempPtr++;
  1383.         }
  1384.       }
  1385.     }
  1386.  
  1387.   }
  1388.  
  1389. // ------------------------------------------------------------------------------------------------
  1390. // Schwärzt (Nullt) eine rechteckige Fläche
  1391. //
  1392. // Parameter:     LONG x1                       (X-Koordinate der linken, oberen Ecke)
  1393. //                LONG y1                       (Y-Koordinate der linken, oberen Ecke)
  1394. //                LONG x2                       (X-Koordinate der rechten, unteren Ecke)
  1395. //                LONG y2                       (Y-Koordinate der rechten, unteren Ecke)
  1396. //
  1397. // globale Var's: UBYTE *GameScr;               (initialisierter Zeiger auf anzuzeigendes Bild)
  1398.  
  1399. void Schwarz(LONG x1, LONG y1, LONG x2, LONG y2) {
  1400.   UBYTE *TempPtr;
  1401.  
  1402.   if(x1<1) x1=1;
  1403.   if(x2>638) x2=638;
  1404.  
  1405.   for(LONG y=y1; y<y2; y++) {
  1406.     TempPtr=MapA+(y*640)+x1;
  1407.     for(LONG x=x1; x<x2; x++) {
  1408.       *TempPtr=0;
  1409.       TempPtr++;
  1410.       }
  1411.     }
  1412.   }
  1413.  
  1414. // ------------------------------------------------------------------------------------------------
  1415. // Initialisiert eine neue Bombe
  1416. //
  1417. // Parameter:     LONG  x                       (StartX)
  1418. //                LONG  y                       (StartY)
  1419. //                LONG  rx                      (KursX)
  1420. //                LONG  ry                      (KursY)
  1421. //                UBYTE Typ                     (Bombentyp)
  1422. //                UBYTE Besitzer                (abfeuerndes Team)
  1423. //
  1424. // globale Var's: struct Bombe Bo[10]           (Array von Bombenstrukturen)
  1425.  
  1426. void NeueBombe(LONG x, LONG y, LONG rx, LONG ry, UBYTE Typ, UBYTE Seite) {
  1427.   LONG Zahl=0;
  1428.  
  1429.   // Leeres Bombenfeld finden
  1430.   while ((Bo[Zahl].Typ>0)&&(Zahl<10)) { Zahl++}
  1431.  
  1432.   if (Zahl<10) {
  1433.     Bo[Zahl].Typ = Typ;
  1434.     Bo[Zahl].Dauer = 25;
  1435.     Bo[Zahl].Seite = Seite;
  1436.     Bo[Zahl].RealX = x;
  1437.     Bo[Zahl].RealY = y;
  1438.     Bo[Zahl].KursX = rx;
  1439.     Bo[Zahl].KursY = ry;
  1440.     SNDBomm=TRUE;
  1441.     }
  1442.   }
  1443.  
  1444. // ------------------------------------------------------------------------------------------------
  1445. // Läßt Bomben fliegen (und explodieren)
  1446. //
  1447. // Parameter:     - keine -
  1448. //
  1449. // globale Var's: struct Bombe  Bo[10]          (Array von Bombenstrukturen)
  1450. //                struct Raumer Fli[20]         (Array von Raumerstrukturen)
  1451. //                UBYTE *GameScr                (initialisierter Zeiger auf anzuzeigendes Bild)
  1452.  
  1453. void MachMaBombe() {
  1454.   LONG i,j,ax,ay, fl=0;
  1455.   BOOL BUMM=FALSE;
  1456.   for (i=0; i<10; i++) {
  1457.     if (Bo[i].Typ) {
  1458.  
  1459.       // Kollisionsabfrage gegen Wände
  1460.       if((Bo[i].RealX<44<<8)&&(Basis[0]==100)) {
  1461.         if((Bo[i].RealY>371<<8)&&(Bo[i].RealY<380<<8)) BUMM = TRUE;
  1462.         if(Bo[i].RealY>471<<8) BUMM = TRUE;
  1463.         }
  1464.  
  1465.       if((Bo[i].RealX>596<<8)&&(Basis[1]==100)) {
  1466.         if((Bo[i].RealY>125<<8)&&(Bo[i].RealY<135<<8)) BUMM = TRUE;
  1467.         if(Bo[i].RealY<32<<8) BUMM = TRUE;
  1468.         }
  1469.  
  1470.       //Kollisionen mit Laserstationen
  1471.       for (j=0; j<4; j++) {
  1472.         ax=(Bo[i].RealX>>8)-LS[j].RealX;
  1473.         ay=(Bo[i].RealY>>8)-LS[j].RealY;
  1474.         if((ax>-5)&&(ax<5)) {
  1475.           if((ay>-5)&&(ay<5)) BUMM=TRUE;
  1476.           }
  1477.         }
  1478.  
  1479.       // Kollisionsabfrage gegen feindliche Raumer
  1480.       if(Bo[i].Seite==Gruen) {
  1481.         for(j=10; j<20; j++) {
  1482.           if(Fli[j].Typ!=Tot) {
  1483.             fl=0;
  1484.             ax=Bo[i].RealX-Fli[j].RealX;
  1485.             ay=Bo[i].RealY-Fli[j].RealY;
  1486.  
  1487.             if((ax>-1024)&&(ax<1024)) fl=3;
  1488.             if((ay>-1024)&&(ay<1024)&&(fl==3)) BUMM = TRUE;
  1489.             }
  1490.           }
  1491.         }
  1492.       else {
  1493.         for(j=0; j<10; j++) {
  1494.           if(Fli[j].Typ!=Tot) {
  1495.             fl=0;
  1496.             ax=Bo[i].RealX-Fli[j].RealX;
  1497.             ay=Bo[i].RealY-Fli[j].RealY;
  1498.  
  1499.             if((ax>-1024)&&(ax<1024)) fl=3;
  1500.             if((ay>-1024)&&(ay<1024)&&(fl==3)) BUMM = TRUE;
  1501.             }
  1502.           }
  1503.         }
  1504.  
  1505.       // Kollision mit Bildschirmrand
  1506.       if ((Bo[i].RealX<1<<8)||(Bo[i].RealX>638<<8)||(Bo[i].RealY<25<<8)||(Bo[i].RealY>477<<8)) BUMM=TRUE;
  1507.  
  1508.       // Kollidiert oder Zeit zu Ende
  1509.       if ((BUMM==TRUE)||(Bo[i].Dauer<1)) {
  1510.  
  1511.         if (Bo[i].Typ==BoNormal) {
  1512.           Kawomm((Bo[i].RealX>>8),(Bo[i].RealY>>8), Mittel);
  1513.           }
  1514.         else {
  1515.           Kawomm((Bo[i].RealX>>8),(Bo[i].RealY>>8), Gross);
  1516.           }
  1517.         SNDRungs=TRUE;
  1518.         Bo[i].Typ = Nichts;
  1519.         BUMM=FALSE;
  1520.         }
  1521.  
  1522.       // Bombe wegmachen
  1523.       if ((Bo[i].RealX>1<<8)&&(Bo[i].RealX<639<<8)&&(Bo[i].RealY>24<<8)&&(Bo[i].RealY<478<<8)) *(MapA + (Bo[i].RealX >> 8) + (Bo[i].RealY >> 8) * 640) = 0;
  1524.  
  1525.       if (Bo[i].Typ) {
  1526.         // Weiterbewegen
  1527.         Bo[i].RealX += Bo[i].KursX;
  1528.         Bo[i].RealY += Bo[i].KursY;
  1529.  
  1530.         // Lebensdauer schrumpfen
  1531.         Bo[i].Dauer--;
  1532.  
  1533.         // Bombe neuzeichnen
  1534.         if ((Bo[i].RealX>1<<8)&&(Bo[i].RealX<639<<8)&&(Bo[i].RealY>24<<8)&&(Bo[i].RealY<478<<8)) *(MapA + (Bo[i].RealX >> 8) + (Bo[i].RealY >> 8) * 640) = 22;
  1535.         }
  1536.       }
  1537.     }
  1538.   }
  1539.  
  1540. // ------------------------------------------------------------------------------------------------
  1541. // Initialisiert neuen Laser
  1542. //
  1543. // Parameter:     UBYTE Typ                     Stark oder Normal
  1544. //                LONG  sx                      X-Startkoordinate
  1545. //                LONG  sy                      Y-Startkoordinate
  1546. //                LONG  zx                      X-Zielkoordinate
  1547. //                LONG  zy                      Y-Zielkoordinate
  1548. //
  1549. // globale Var's: struct Laser  Bo[20]          (Array von Bombenstrukturen)
  1550.  
  1551. void NeuerLaser(UBYTE Typ, LONG sx, LONG sy, LONG zx, LONG zy) {
  1552.   LONG Zahl=0;
  1553.  
  1554.   while ((La[Zahl].Typ!=0)&&(Zahl<20)) { Zahl++; }
  1555.  
  1556.   if(Zahl<20) {
  1557.     La[Zahl].Typ=Typ;
  1558.     La[Zahl].Frame=0;
  1559.     La[Zahl].StartX=sx;
  1560.     La[Zahl].StartY=sy;
  1561.     La[Zahl].ZielX=zx;
  1562.     La[Zahl].ZielY=zy;
  1563.     }
  1564.   }
  1565.  
  1566. // ------------------------------------------------------------------------------------------------
  1567. // Verarbeitet alle Laserschüsse
  1568. //
  1569. // Parameter:     - keine -
  1570. //
  1571. // globale Var's: struct Laser  La[10]          (Array von Laserstrukturen)
  1572. //                *UBYTE MapA                   (Zeiger auf Bild in der Grafikkarte)
  1573. //                struct RTGScreen RScreen      (Struktur des RTGScreens)
  1574.  
  1575. void MachMaLaser() {
  1576.   LONG i;
  1577.  
  1578.   for (i=0; i<20; i++) {
  1579.     if(La[i].Typ) {
  1580.       La[i].Frame++;
  1581.       // Letztes Frame setzt la.Frame auf -irgendwas
  1582.       if((La[i].Frame<0)&&(La[i].Typ==LA_Stark)) La[i].Typ=Nichts;
  1583.       if((La[i].Frame<0)&&(La[i].Typ==LA_Normal)) La[i].Typ=Nichts;
  1584.  
  1585.       // Letztes Frame ist Schwarz
  1586.       if((La[i].Frame==LA_DaStark)&&(La[i].Typ==LA_Stark)) La[i].Frame=-26;
  1587.       if((La[i].Frame==LA_DaNormal)&&(La[i].Typ==LA_Normal)) La[i].Frame=-29;
  1588.  
  1589.       if(La[i].Typ!=Nichts) {
  1590.         if(La[i].Typ==LA_Stark) {
  1591.           DrawRtgLine(RScreen, MapA, 26+La[i].Frame, La[i].StartX, La[i].StartY, La[i].ZielX, La[i].ZielY);
  1592.           }
  1593.         if(La[i].Typ==LA_Normal) {
  1594.           DrawRtgLine(RScreen, MapA, 29+La[i].Frame, La[i].StartX, La[i].StartY, La[i].ZielX, La[i].ZielY);
  1595.           }
  1596.         }
  1597.       }
  1598.     }
  1599.   }
  1600.  
  1601. // ------------------------------------------------------------------------------------------------
  1602. // Sucht nahstes Ziel
  1603. //
  1604. // Parameter:     LONG x                        (X-Koordinate, von der aus gesucht wird)
  1605. //                LONG y                        (Y-Koordinate, von der aus gesucht wird)
  1606. //                UBYTE Seite                   (Wer greift an? (Grün/Blau))
  1607. //                LONG MaxEntf                  (Maximale Entfernung zum Zielobjekt)
  1608. //
  1609. // globale Var's: struct Raumer Fli[20]         (Array von Raumerstrukturen)
  1610. //
  1611.  
  1612. UBYTE SucheZiel(LONG x, LONG y, UBYTE Seite, LONG MaxEntf) {
  1613.   UBYTE t=99;
  1614.   MaxEntf*=MaxEntf;
  1615.  
  1616.   if(Seite==Gruen) {
  1617.     LONG ax, ay, ent, g;
  1618.  
  1619.     for(g=10; g<20; g++) {
  1620.       ax=x-(Fli[g].RealX>>8);
  1621.       ay=y-(Fli[g].RealY>>8);
  1622.  
  1623.       ent=(ax*ax+ay*ay);
  1624.  
  1625.       if((ent<MaxEntf)&&(Fli[g].Typ)&&(!Fli[g].Raucher)) {
  1626.         MaxEntf=ent;
  1627.         t=g;
  1628.         }
  1629.       }
  1630.  
  1631.     // Laserstationen in der Nähe?
  1632.     for(g=0; g<2; g++) {
  1633.       ax=x-LS[g+2].RealX; ay=y-LS[g+2].RealY;
  1634.       ent=(ax*ax+ay*ay);
  1635.       if(ent<MaxEntf) {
  1636.         MaxEntf=ent;
  1637.         t=22+g;
  1638.         }
  1639.       }
  1640.     }
  1641.   else {
  1642.     LONG ax, ay, ent, g;
  1643.  
  1644.     for(g=0; g<10; g++) {
  1645.       ax=x-(Fli[g].RealX>>8);
  1646.       ay=y-(Fli[g].RealY>>8);
  1647.  
  1648.       ent=(ax*ax+ay*ay);
  1649.  
  1650.       if((ent<MaxEntf)&&(Fli[g].Typ)&&(!Fli[g].Raucher)) {
  1651.         MaxEntf=ent;
  1652.         t=g;
  1653.         }
  1654.       }
  1655.     // Laserstationen in der Nähe?
  1656.     for(g=0; g<2; g++) {
  1657.       ax=x-LS[g].RealX; ay=y-LS[g].RealY;
  1658.       ent=(ax*ax+ay*ay);
  1659.       if(ent<MaxEntf) {
  1660.         MaxEntf=ent;
  1661.         t=20+g;
  1662.         }
  1663.       }
  1664.     }
  1665.   return(t);
  1666.   }
  1667.  
  1668. // ------------------------------------------------------------------------------------------------
  1669. // Arbeitet alle Laserstationen ab
  1670. //
  1671. // Parameter:     - keine -
  1672. //
  1673. // globale Var's: struct Raumer Fli[20]         (Array von Raumerstrukturen)
  1674. //                struct LaserSt LS[4]          (Array der Laserstationen)
  1675.  
  1676. BOOL MachMaLaserSt() {
  1677.   UBYTE zg, i;
  1678.   BOOL Zahlen;
  1679.  
  1680.   for(i=0; i<4; i++) {
  1681.     if(LS[i].Energie>-20) {
  1682.       if((LS[i].Energie<LS_kaputt)&&(LS[i].Energie>0)) {
  1683.         if((GlobTime&3)==0) Kawomm(LS[i].RealX, LS[i].RealY, Mini);
  1684.         }
  1685.       if((LS[i].Energie<LS_MaxEnergie)&&((GlobTime&31)==0)&&(LS[i].Energie>0)) LS[i].Energie++;
  1686.       if((LS[i].Energie<5)&&(LS[i].RealX>-100)) {
  1687.         LS[i].Energie=-20;
  1688.         Kawomm(LS[i].RealX, LS[i].RealY, Mittel);
  1689.         SNDFetz=TRUE;
  1690.         LS[i].RealX=-200;
  1691.         LS[i].RealY=-200;
  1692.         if(((i&1)==1)&&(Basis[i>>1]==100)) Basis[i>>1]=70;
  1693.         }
  1694.  
  1695.       if((i&1)==0) {
  1696.         zg=SucheZiel(LS[i].RealX, LS[i].RealY, i>>1, LS_SchussEntf);
  1697.  
  1698.         if((LS[i].Pause==0)&&(LS[i].Energie>=LS_kaputt)) {
  1699.           if((i<2)&&(zg>9)&&(zg<20)) {
  1700.             NeuerLaser(LA_Stark, LS[i].RealX, LS[i].RealY, Fli[zg].RealX>>8, Fli[zg].RealY>>8);
  1701.             Fli[zg].Energie-=5;
  1702.             LS[i].Pause=8;
  1703.             SNDStation=TRUE;
  1704.             Kawomm(Fli[zg].RealX>>8,Fli[zg].RealY>>8,Mini);
  1705.             if(Fli[zg].Energie<1) {
  1706.               Fli[zg].Raucher=TRUE;
  1707.               Fli[zg].Aktiv=FALSE;
  1708.               Fli[zg].MaxEnergie=20+(rand()&15);
  1709.               }
  1710.             Zahlen=TRUE;
  1711.             }
  1712.  
  1713.           if((i>1)&&(zg<10)) {
  1714.             NeuerLaser(LA_Stark, LS[i].RealX, LS[i].RealY, Fli[zg].RealX>>8, Fli[zg].RealY>>8);
  1715.             Fli[zg].Energie-=5;
  1716.             LS[i].Pause=8;
  1717.             SNDStation=TRUE;
  1718.             Kawomm(Fli[zg].RealX>>8,Fli[zg].RealY>>8,Mini);
  1719.             if(Fli[zg].Energie<1) {
  1720.               Fli[zg].Raucher=TRUE;
  1721.               Fli[zg].Aktiv=FALSE;
  1722.               Fli[zg].MaxEnergie=20+(rand()&15);
  1723.               }
  1724.             Zahlen=TRUE;
  1725.             }
  1726.           }
  1727.         if(LS[i].Pause>0) LS[i].Pause--;
  1728.         }
  1729.  
  1730.       if(i==0) PasteGfx(LS[i].RealX, LS[i].RealY, 6, 6, GrLaser);
  1731.       if(i==1) PasteGfx(LS[i].RealX, LS[i].RealY, 6, 6, Schild);
  1732.       if(i==2) PasteGfx(LS[i].RealX, LS[i].RealY, 6, 6, BlLaser);
  1733.       if(i==3) PasteGfx(LS[i].RealX, LS[i].RealY, 6, 6, Schild);
  1734.       }
  1735.     }
  1736.  
  1737.   return(Zahlen);
  1738.   }
  1739.  
  1740. // ------------------------------------------------------------------------------------------------
  1741. // Arbeitet beide Basen ab (Explosionen und blabla)
  1742. //
  1743. // Parameter:     - keine -
  1744. //
  1745. // globale Var's: LONG Basis[2]                 (Array der Basen)
  1746. //
  1747.  
  1748. void MachMaBasis() {
  1749.   LONG i;
  1750.   for (i=0; i<2; i++) {
  1751.     if ((Basis[i]<100)&&(Basis[i]>0)) {
  1752.       if ((Basis[i]>1)&&((Basis[i]&1)==0)) {
  1753.         if (i==0) Kawomm((rand()%35)+3,(rand()%100)+375,Winzig);
  1754.         if (i==1) Kawomm((rand()%35)+600,(rand()%100)+28,Winzig);
  1755.         SNDRungs=TRUE;
  1756.         }
  1757.       if (Basis[i]==1) {
  1758.         if (i==0) Kawomm(20,425,GeradezuUnglaublich);
  1759.         if (i==1) Kawomm(620,78,GeradezuUnglaublich);
  1760.         SNDRungs=TRUE;
  1761.         SNDFetz=TRUE;
  1762.         }
  1763.       Basis[i]--;
  1764.       }
  1765.     }
  1766.   }
  1767.  
  1768.  
  1769. // ------------------------------------------------------------------------------------------------
  1770. // Öffnet und initialisiert AHI
  1771. //
  1772. // Parameter:     - keine -
  1773. //
  1774. // globale Var's: - hab jetzt keinen Bock -
  1775. //
  1776.  
  1777. BOOL OpenAHI() {
  1778.  
  1779.   if(AHImp = CreateMsgPort()) {
  1780.     if(AHIio = (struct AHIRequest *)CreateIORequest(AHImp,sizeof(struct AHIRequest))) {
  1781.  
  1782.       AHIio->ahir_Version = 4;
  1783.  
  1784.       if(!(AHIDevice = OpenDevice(AHINAME, AHI_NO_UNIT, (struct IORequest *) AHIio,NULL))) {
  1785.         AHIBase = (struct Library *) AHIio->ahir_Std.io_Device;
  1786.         return TRUE;
  1787.       }
  1788.     }
  1789.   }
  1790.   FreeAudio();
  1791.   return FALSE;
  1792. }
  1793.  
  1794.  
  1795. // ------------------------------------------------------------------------------------------------
  1796. // Schließt AHI wieder
  1797. //
  1798. // Parameter:     - keine -
  1799. //
  1800. // globale Var's: - wie oben -
  1801. //
  1802.  
  1803. void CloseAHI() {
  1804.  
  1805.   if(!AHIDevice) CloseDevice((struct IORequest *)AHIio);
  1806.  
  1807.   AHIDevice=-1;
  1808.  
  1809.   if(AHIio) DeleteIORequest((struct IORequest *)AHIio);
  1810.   AHIio=NULL;
  1811.  
  1812.   if(AHImp) DeleteMsgPort(AHImp);
  1813.   AHImp=NULL;
  1814. }
  1815.  
  1816. // ------------------------------------------------------------------------------------------------
  1817. // Öffnet AHI-Requester und allokiert die Audiokanäle
  1818. //
  1819. // Parameter:     - keine -
  1820. //
  1821. // globale Var's: - siehe oben -
  1822. //
  1823.  
  1824. BOOL AllocAudio() {
  1825.   struct AHIAudioModeRequester *req;
  1826.   BOOL   rc = FALSE;
  1827.  
  1828.   // Requester öffnen
  1829.   req = AHI_AllocAudioRequest(AHIR_PubScreenName, NULL,
  1830.                               AHIR_TitleText,     "choose AHI-blahblah",
  1831.                               AHIR_DoMixFreq,     TRUE,
  1832.                               TAG_DONE);
  1833.  
  1834.   if(req) {          // erfolgreich?
  1835.     if(AHI_AudioRequest(req, TAG_DONE)) {
  1836.       actrl = AHI_AllocAudio(                          //Wenn ja, dann reserviere mal
  1837.           AHIA_AudioID,         req->ahiam_AudioID,
  1838.           AHIA_MixFreq,         req->ahiam_MixFreq,
  1839.           AHIA_Channels,        CHANNELS,
  1840.           AHIA_Sounds,          MAXSAMPLES,
  1841.           AHIA_PlayerFunc,      NULL,
  1842.           AHIA_PlayerFreq,      INT_FREQ<<16,
  1843.           AHIA_MinPlayerFreq,   INT_FREQ<<16,
  1844.           AHIA_MaxPlayerFreq,   INT_FREQ<<16,
  1845.           TAG_DONE);
  1846.  
  1847.       if(actrl) {      // Hat's geklappt?
  1848.         AHI_ControlAudio(actrl, AHIC_MixFreq_Query, &mixfreq, TAG_DONE);  //Dann ev. Mixen initialisieren
  1849.         rc = TRUE;
  1850.       }
  1851.     }
  1852.     AHI_FreeAudioRequest(req);  // Und Requester freigeben
  1853.   }
  1854.   return rc;
  1855. }
  1856.  
  1857. // ------------------------------------------------------------------------------------------------
  1858. // Gibt die Audiokanäle wieder frei
  1859. //
  1860. // Parameter:     - keine -
  1861. //
  1862. // globale Var's: - siehe eins drüber -
  1863. //
  1864.  
  1865. void FreeAudio() {
  1866.  
  1867.   if(actrl) AHI_FreeAudio(actrl);
  1868.   actrl = NULL;
  1869. }
  1870.  
  1871. // ------------------------------------------------------------------------------------------------
  1872. // Lädt ein Sample ein (!!RAW!! 8Bit oder 16Bit), gibt dann SampleID zurück, oder AHI_NOSOUND, wenn
  1873. // es schiefgeht
  1874. //
  1875. // Parameter:     STRPTR filename               (Dateiname des einzuladenden Samples)
  1876. //                ULONG type                    (Typ des Samples (meist RAW 8Bit))
  1877. //
  1878. // globale Var's: - siehe eins drüber -
  1879. //
  1880.  
  1881. UWORD LoadSample(STRPTR filename, ULONG type) {
  1882.   struct AHISampleInfo sample;
  1883.   APTR *samplearray = samples;
  1884.   UWORD id = 0, rc = AHI_NOSOUND;
  1885.   ULONG file;
  1886.  
  1887.   // Sucht ein freies Sample
  1888.  
  1889.   while(*samplearray) {
  1890.     id++;
  1891.     samplearray++;
  1892.     if(id >= MAXSAMPLES) {
  1893.       return AHI_NOSOUND;
  1894.     }
  1895.   }
  1896.  
  1897.   file = Open(filename, MODE_OLDFILE);
  1898.  
  1899.   if(file) {
  1900.     int length;
  1901.  
  1902.     Seek(file, 0, OFFSET_END);
  1903.     length = Seek(file, 0, OFFSET_BEGINNING);
  1904.     *samplearray = AllocVec(length, MEMF_PUBLIC);
  1905.     if(*samplearray) {
  1906.       Read(file, *samplearray, length);
  1907.  
  1908.       sample.ahisi_Type = type;
  1909.       sample.ahisi_Address = *samplearray;
  1910.       sample.ahisi_Length = length / AHI_SampleFrameSize(type);
  1911.  
  1912.       if(! AHI_LoadSound(id, AHIST_SAMPLE, &sample, actrl)) {
  1913.         rc = id;
  1914.       }
  1915.     }
  1916.     Close(file);
  1917.   }
  1918.   return rc;
  1919. }
  1920.  
  1921. // ------------------------------------------------------------------------------------------------
  1922. // Wirft ein Sample im hohen Bogen aus dem RAM (die Var zur Höhe des Bogens hab' ich jetzt
  1923. // mal rausgelassen)
  1924. //
  1925. // Parameter:     id                            (ID des rauszuwerfenden Samples)
  1926. //
  1927. // globale Var's: - siehe eins drüber -
  1928. //
  1929.  
  1930. void UnloadSample(UWORD id) {
  1931.  
  1932.   AHI_UnloadSound(id, actrl);
  1933.   FreeVec(samples[id]);
  1934.   samples[id] = NULL;
  1935. }
  1936.  
  1937. // ------------------------------------------------------------------------------------------------
  1938. // Spielt ein Sample ab (auf 8300 Hertz)
  1939. //
  1940. // Parameter:     WORD SampleID                 (ID des Samples (siehe Sample-Definitionen))
  1941. //
  1942. // globale Var's: - siehe eins drüber -
  1943. //
  1944.  
  1945. void  SpielMaSample(WORD SampleID) {
  1946.   Kanal++; Kanal&=3;
  1947.  
  1948.   AHI_Play(actrl, AHIP_BeginChannel,  Kanal,
  1949.                   AHIP_Freq,          8300,
  1950.                   AHIP_Vol,           0x10000,
  1951.                   AHIP_Pan,           0xc000,
  1952.                   AHIP_Sound,         SampleID,
  1953.                   AHIP_LoopSound,     AHI_NOSOUND,
  1954.                   AHIP_EndChannel,    NULL,
  1955.                   TAG_DONE,           NULL);
  1956.   }
  1957.  
  1958.  
  1959. // ------------------------------------------------------------------------------------------------
  1960. // Spielt ein Sample ab (auf beliebigen Herzen)
  1961. //
  1962. // Parameter:     WORD SampleID                 (ID des Samples (siehe Sample-Definitionen))
  1963. //                LONG Freq                     (Anzahl der Herzen)
  1964. //
  1965. // globale Var's: - siehe eins drüber -
  1966. //
  1967.  
  1968. void  SpielMaSample2(WORD SampleID, LONG Freq) {
  1969.   Kanal++; Kanal&=3;
  1970.  
  1971.   AHI_Play(actrl, AHIP_BeginChannel,  Kanal,
  1972.                   AHIP_Freq,          Freq,
  1973.                   AHIP_Vol,           0x10000,
  1974.                   AHIP_Pan,           0xc000,
  1975.                   AHIP_Sound,         SampleID,
  1976.                   AHIP_LoopSound,     AHI_NOSOUND,
  1977.                   AHIP_EndChannel,    NULL,
  1978.                   TAG_DONE,           NULL);
  1979.   }
  1980.  
  1981.  
  1982. // ------------------------------------------------------------------------------------------------
  1983. // Überprüft, welche Samples des Users Ohr erfreuen sollen und erfreut dann
  1984. //
  1985. // Parameter:     - Keine -
  1986. //
  1987. // globale Var's: - die ganzen Sound-BOOLs -
  1988. //
  1989.  
  1990. void  MachMaSounds() {
  1991.   if(SNDStation) {
  1992.     SNDStation=FALSE;
  1993.     SpielMaSample(SND_StatLaser);
  1994.     }
  1995.  
  1996.   if(SNDRungs) {
  1997.     SNDRungs=FALSE;
  1998.     SpielMaSample(SND_BombExplo);
  1999.     }
  2000.  
  2001.   if(SNDFetz) {
  2002.     SNDFetz=FALSE;
  2003.     SpielMaSample(SND_RaumerExplo);
  2004.     }
  2005.  
  2006.   if(SNDMiniLaser) {
  2007.     SNDMiniLaser=FALSE;
  2008.     SpielMaSample(SND_FightLaser);
  2009.     }
  2010.  
  2011.   if(SNDBigLaser) {
  2012.     SNDBigLaser=FALSE;
  2013.     SpielMaSample(SND_SFightLaser);
  2014.     }
  2015.  
  2016.   if(SNDBomm) {
  2017.     SNDBomm=FALSE;
  2018.     SpielMaSample(SND_BombShot);
  2019.     }
  2020.   }
  2021.  
  2022.  
  2023.